
Adélia Cruz
Neural Network Developer
TL;DR: Los flujos de trabajo de CrewAI suelen encontrarse con CAPTCHA; integrar CapSolver permite a los scripts automatizados resolverlos de manera eficiente.

Al automatizar tareas con CrewAI, como el scraping de web o la navegación, los CAPTCHAs pueden bloquear fácilmente su flujo de trabajo. Estos desafíos son comunes al acceder a sitios web protegidos y pueden interrumpir incluso scripts de automatización bien diseñados.
CapSolver ofrece una forma confiable de manejar los CAPTCHAs, permitiendo que CrewAI continúe con sus tareas sin intervención manual. Al integrar CapSolver, puede optimizar la navegación automatizada y la recopilación de datos manteniéndose en cumplimiento con las protecciones de los sitios web.
CrewAI es un framework de Python ligero y rápido para construir sistemas de agentes de IA autónomos. Creado desde cero, completamente independiente de LangChain u otros frameworks de agentes, CrewAI ofrece tanto facilidad de uso a alto nivel como capacidades de personalización granular.
CrewAI opera en dos paradigmas complementarios:
| Componente | Descripción |
|---|---|
| Crews | Equipos de agentes que colaboran de forma autónoma, permitiendo resolver problemas de forma flexible con roles especializados |
| Flows | Flujos de trabajo basados en eventos que ofrecen control preciso de la ejecución para lógica de negocio compleja |
CapSolver es un servicio líder para resolver CAPTCHAs que proporciona soluciones impulsadas por IA para evitar diversos desafíos de CAPTCHA. Con soporte para múltiples tipos de CAPTCHA y tiempos de respuesta rápidos, CapSolver se integra sin problemas en flujos automatizados.
Al construir agentes de CrewAI que interactúan con sitios web, ya sea para recopilar datos, pruebas automatizadas o agregación de contenido, los desafíos de CAPTCHA se convierten en un obstáculo significativo. Aquí radica la importancia de la integración:
Primero, instale los paquetes requeridos:
pip install crewai
pip install 'crewai[tools]'
pip install requests
CrewAI le permite crear herramientas personalizadas que los agentes pueden usar para realizar sus tareas. Aquí le mostramos cómo crear una herramienta de CapSolver para manejar desafíos de CAPTCHA:
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
class CaptchaSolverInput(BaseModel):
"""Esquema de entrada para la herramienta CaptchaSolver."""
website_url: str = Field(..., description="La URL del sitio web con CAPTCHA")
website_key: str = Field(..., description="La clave del sitio del CAPTCHA")
captcha_type: str = Field(default="ReCaptchaV2TaskProxyLess", description="Tipo de CAPTCHA a resolver")
class CaptchaSolverTool(BaseTool):
name: str = "captcha_solver"
description: str = "Resuelve desafíos de CAPTCHA usando la API de CapSolver. Soporta reCAPTCHA v2, v3, Turnstile, entre otros."
args_schema: Type[BaseModel] = CaptchaSolverInput
def _run(self, website_url: str, website_key: str, captcha_type: str = "ReCaptchaV2TaskProxyLess") -> str:
# Crear tarea
create_task_url = "https://api.capsolver.com/createTask"
task_payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": captcha_type,
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post(create_task_url, json=task_payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error al crear la tarea: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Consultar resultado
get_result_url = "https://api.capsolver.com/getTaskResult"
for _ in range(60): # Máximo 60 intentos
time.sleep(2)
result_payload = {
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
response = requests.post(get_result_url, json=result_payload)
result = response.json()
if result.get("status") == "ready":
solution = result.get("solution", {})
return solution.get("gRecaptchaResponse") or solution.get("token")
elif result.get("status") == "failed":
return f"Tarea fallida: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución del CAPTCHA"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
class ReCaptchaV2Input(BaseModel):
"""Esquema de entrada para el solucionador de reCAPTCHA v2."""
website_url: str = Field(..., description="La URL del sitio web con reCAPTCHA v2")
website_key: str = Field(..., description="La clave del sitio de reCAPTCHA")
class ReCaptchaV2Tool(BaseTool):
name: str = "recaptcha_v2_solver"
description: str = "Resuelve desafíos de reCAPTCHA v2 usando CapSolver"
args_schema: Type[BaseModel] = ReCaptchaV2Input
def _run(self, website_url: str, website_key: str) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
return self._solve_captcha(payload)
def _solve_captcha(self, payload: dict) -> str:
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Consultar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
class ReCaptchaV3Input(BaseModel):
"""Esquema de entrada para el solucionador de reCAPTCHA v3."""
website_url: str = Field(..., description="La URL del sitio web con reCAPTCHA v3")
website_key: str = Field(..., description="La clave del sitio de reCAPTCHA")
page_action: str = Field(default="submit", description="El parámetro de acción para reCAPTCHA v3")
class ReCaptchaV3Tool(BaseTool):
name: str = "recaptcha_v3_solver"
description: str = "Resuelve desafíos de reCAPTCHA v3 con verificación basada en puntuación"
args_schema: Type[BaseModel] = ReCaptchaV3Input
def _run(
self,
website_url: str,
website_key: str,
page_action: str = "submit"
) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
"pageAction": page_action
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Consultar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
class TurnstileInput(BaseModel):
"""Esquema de entrada para el solucionador de Turnstile."""
website_url: str = Field(..., description="La URL del sitio web con Turnstile")
website_key: str = Field(..., description="La clave del sitio del widget Turnstile")
class TurnstileTool(BaseTool):
name: str = "turnstile_solver"
description: str = "Resuelve desafíos de Cloudflare Turnstile"
args_schema: Type[BaseModel] = TurnstileInput
def _run(self, website_url: str, website_key: str) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Consultar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
class CloudflareChallengeInput(BaseModel):
"""Esquema de entrada para el solucionador de Cloudflare Challenge."""
website_url: str = Field(..., description="La URL de la página protegida")
proxy: str = Field(..., description="Proxy en formato: http://usuario:contraseña@ip:puerto")
class CloudflareChallengeTool(BaseTool):
name: str = "cloudflare_challenge_solver"
description: str = "Resuelve páginas de desafío de Cloudflare de 5 segundos"
args_schema: Type[BaseModel] = CloudflareChallengeInput
def _run(self, website_url: str, proxy: str) -> dict:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiCloudflareTask",
"websiteURL": website_url,
"proxy": proxy
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Consultar resultado
for attempt in range(60):
time.sleep(3)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return {
"cookies": result["solution"]["cookies"],
"user_agent": result["solution"]["userAgent"]
}
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
Cada tipo de CAPTCHA requiere un método de envío diferente:
Para reCAPTCHA, inyecte el token en el área de texto oculta y envíe el formulario:
from selenium import webdriver
from selenium.webdriver.common.by import By
def submit_recaptcha_token(driver, token: str):
"""Inyectar token de reCAPTCHA y enviar"""
# Hacer visible el área de texto oculta y establecer el token
recaptcha_response = driver.find_element(By.ID, "g-recaptcha-response")
driver.execute_script("arguments[0].style.display = 'block';", recaptcha_response)
recaptcha_response.clear()
recaptcha_response.send_keys(token)
# Enviar el formulario
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
Para Turnstile, establezca el token en el campo de entrada oculto:
def submit_turnstile_token(driver, token: str):
"""Inyectar token de Turnstile y enviar"""
# Establecer token en el campo de entrada oculto
turnstile_input = driver.find_element(By.NAME, "cf-turnstile-response")
driver.execute_script("arguments[0].value = arguments[1];", turnstile_input, token)
# Enviar el formulario
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
Para Cloudflare Challenge (5s), CapSolver devuelve cookies y user-agent en lugar de un token. Úselos en sus solicitudes:
import requests
def accessar_pagina_protegida_cloudflare(url: str, cf_solution: dict):
"""
Utilice la solución de desafío de Cloudflare para acceder a la página protegida.
cf_solution contiene 'cookies' y 'user_agent' de CapSolver.
"""
# Crear sesión con las cookies resueltas
session = requests.Session()
# Establecer las cookies de la solución de CapSolver
for cookie in cf_solution["cookies"]:
session.cookies.set(cookie["name"], cookie["value"])
# Establecer el agente de usuario que se usó para resolver
headers = {
"User-Agent": cf_solution["user_agent"]
}
# Ahora puedes acceder a la página protegida
response = session.get(url, headers=headers)
return response.text
### Ejemplo completo de raspado
```python
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
CLAVE_API_CAPSOLVER = "TU_CLAVE_API_CAPSOLVER"
def resolver_recaptcha(url_sitio: str, clave_sitio: str) -> str:
"""Obtener token reCAPTCHA de CapSolver"""
payload = {
"clientKey": CLAVE_API_CAPSOLVER,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": url_sitio,
"websiteKey": clave_sitio
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
resultado = response.json()
if resultado.get("errorId") != 0:
raise Exception(f"Error: {resultado.get('errorDescription')}")
id_tarea = resultado.get("taskId")
for _ in range(60):
time.sleep(2)
resultado = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CLAVE_API_CAPSOLVER, "taskId": id_tarea}
).json()
if resultado.get("status") == "ready":
return resultado["solution"]["gRecaptchaResponse"]
if resultado.get("status") == "failed":
raise Exception(f"Falló: {resultado.get('errorDescription')}")
raise Exception("Tiempo de espera agotado")
def raspado_con_recaptcha(url_objetivo: str, clave_sitio: str):
"""Flujo completo: resolver CAPTCHA → enviar → raspado"""
driver = webdriver.Chrome()
driver.get(url_objetivo)
try:
# 1. Resolver CAPTCHA
token = resolver_recaptcha(url_objetivo, clave_sitio)
# 2. Inyectar token
campo_recaptcha = driver.find_element(By.ID, "g-recaptcha-response")
driver.execute_script("arguments[0].style.display = 'block';", campo_recaptcha)
campo_recaptcha.clear()
campo_recaptcha.send_keys(token)
# 3. Enviar formulario
driver.find_element(By.TAG_NAME, "form").submit()
# 4. Raspado de contenido
time.sleep(3) # Esperar a que se cargue la página
return driver.page_source
finally:
driver.quit()
Para escenarios que requieren automatización de navegadores dentro de CrewAI, puede utilizar la extensión de CapSolver:
Descargar la extensión: Obtenga la extensión de CapSolver desde capsolver.com
Configurar con Selenium/Playwright: Cargue la extensión en su herramienta de automatización de navegadores
Modo de resolución automática: La extensión detecta y resuelve automáticamente los CAPTCHAs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Configurar Chrome con la extensión de CapSolver
opciones_chrome = Options()
opciones_chrome.add_extension("ruta/a/capsolver-extensión.crx")
driver = webdriver.Chrome(options=opciones_chrome)
# La extensión manejará automáticamente los CAPTCHAs
driver.get("https://ejemplo.com/pagina-protegida")
def resolver_con_reintento(self, payload: dict, max_reintentos: int = 3) -> str:
for intento in range(max_reintentos):
try:
resultado = self._resolver_captcha(payload)
if resultado:
return resultado
except Exception as e:
if intento == max_reintentos - 1:
raise
time.sleep(2 ** intento) # Retroalimentación exponencial
def verificar_balance() -> float:
response = requests.post(
"https://api.capsolver.com/getBalance",
json={"clientKey": CLAVE_API_CAPSOLVER}
)
return response.json().get("balance", 0)
Para acceso repetido a las mismas páginas, almacene en caché los tokens CAPTCHA cuando sea apropiado:
from functools import lru_cache
from datetime import datetime, timedelta
cache_captcha = {}
def obtener_token_caché(url_sitio: str, clave_sitio: str) -> str:
clave_cache = f"{url_sitio}:{clave_sitio}"
if clave_cache in cache_captcha:
token, timestamp = cache_captcha[clave_cache]
if datetime.now() - timestamp < timedelta(minutes=2):
return token
# Resolver nuevo CAPTCHA
nuevo_token = resolver_captcha(url_sitio, clave_sitio)
cache_captcha[clave_cache] = (nuevo_token, datetime.now())
return nuevo_token
La integración de CapSolver con CrewAI desbloquea el potencial completo de los agentes de IA autónomos para tareas basadas en la web. Al combinar el poderoso orquestador de agentes de CrewAI con las capacidades líderes en la industria de CapSolver para resolver CAPTCHAs, los desarrolladores pueden construir soluciones de automatización robustas que manejen incluso los mecanismos más desafiantes de protección web.
Ya sea que esté construyendo pipelines de extracción de datos, marcos de pruebas automatizadas o agentes web inteligentes, la combinación CrewAI + CapSolver proporciona la confiabilidad y escalabilidad necesarias para entornos de producción.
¿Listo para comenzar? Regístrese en CapSolver y use el código de bonificación CREWAI para obtener un 6% adicional en cada recarga!

CrewAI es un marco de Python ágil y rápido para construir sistemas de agentes de IA autónomos. Permite a los desarrolladores crear equipos de agentes de IA que colaboran para lograr tareas complejas, con soporte tanto para toma de decisiones autónoma como para control preciso del flujo de trabajo.
CapSolver se integra con CrewAI mediante herramientas personalizadas. Crea una herramienta que envuelva la API de CapSolver, permitiendo que tus agentes de IA resuelvan automáticamente los desafíos de CAPTCHA cuando los encuentren durante las operaciones web.
CapSolver admite una amplia gama de tipos de CAPTCHA, incluyendo reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, AWS WAF, GeeTest y muchos más.
CapSolver ofrece precios competitivos según el tipo y volumen de CAPTCHAs resueltos. Visite capsolver.com para conocer los detalles de precios actuales. Use el código CREWAI para obtener un 6% de bonificación en su primer recarga.
Sí. CapSolver proporciona una API REST que se puede integrar con cualquier marco de Python, incluyendo Scrapy, Selenium, Playwright y más.
Sí, CrewAI es de código abierto y se distribuye bajo la licencia MIT. El marco es gratuito para usar, aunque es posible que incurra en costos por llamadas a la API de modelos de lenguaje (como OpenAI) y servicios de resolución de CAPTCHA como CapSolver.
La clave del sitio generalmente se encuentra en la fuente HTML de la página. Busque:
data-sitekey o llamada a grecaptcha.render()data-sitekeydata-sitekey en el widget de TurnstileAprende una arquitectura de raspado web escalable en Rust con reqwest, scraper, raspado asíncrono, raspado con navegador sin cabeza, rotación de proxies y manejo de CAPTCHA conforme.

Automatiza la resolución de CAPTCHA con Nanobot y CapSolver. Utiliza Playwright para resolver reCAPTCHA y Cloudflare autónomamente.
